<?php

if($_SERVER['REMOTE_ADDR'] != "82.228.183.111" && $_SERVER['REMOTE_ADDR'] != "91.121.178.42"){ //TODO Les serveurs enregistrant les scores doivent être autorisés ici et dans le .htaccess (à adapter/automatiser)
	echo "Acces refusé.";
	exit();
}

include($_SERVER["DOCUMENT_ROOT"]."/bob.php");
include($_SERVER["DOCUMENT_ROOT"]."/fonctions_globales.php");
$mysqli = new_mysqli($host, $user, $password, $database); //connection à la DB


function save_result_player($mysqli, $id_player, $palier_n_data_player, $is_vainqueur, $palier_adv, $idendgame, $ajustement, $type_defaite) {
    $data_player = $palier_n_data_player[1];
    $palier_pris_en_compte = ($is_vainqueur ? $palier_adv : $palier_n_data_player[0]);
    //Incrémentation des compteurs de victoire et de défaite.
    $increment_game = "";
    if($data_player['out_training'] == 1)
        $increment_game = ($is_vainqueur ? "nb_victoires_conquete = (nb_victoires_conquete+1)" : "nb_defaites_conquete = (nb_defaites_conquete+1)").", ";
    
    //Gains et perte de territoires
    $gain_territoires = 0;
    if($data_player['out_training'] == 1 && $type_defaite == 4){ //4 est le type de defaite de la redition. On ne gagne pas les territoires que l'autre ne perd pas (et on perd rien si on a perdu)
        if($is_vainqueur) //TODO voir si NO_LOAD ça fait la même ?
            $gain_territoires = $palier_pris_en_compte['indice_victoire'] + $palier_pris_en_compte['indice_defaite'];
    } else if($data_player['out_training'] == 1) //On ne gagne pas de territoire en mode entrainement (= bac à sable).
        $gain_territoires = ($is_vainqueur ? $palier_pris_en_compte['indice_victoire'] : $palier_pris_en_compte['indice_defaite']) + $ajustement;
    //Gains d'XP et de niveaux.
    //31 est une base arbitraire. Ensuite on ajoute 3 par niveau pour obtenir la base d'XP, et on la multiplie par l'indice de victoire ou de défaite, selon.
    $gain_xp = round((31 + 3 * $data_player['game_level']) * $palier_adv[($is_vainqueur ? 'indice_victoire_xp' : 'indice_defaite_xp')]);
    //Formule permettant de calculer le palier d'XP à atteindre pour arriver au niveau suivant, sachant qu'il commence à 50 et gagne 50 tous les niveaux (somme des nombres de 1 à game_level, multiplié par 50)
    $gain_niveau = ($gain_xp + $data_player['experience'] >= how_much_xp($data_player['game_level'] + 1)) ? 1 : 0;
    
    $gains_titre = "";
    $last_palier_reached = $data_player['last_palier_reached'];
    //On regarde si on a pas atteint un nouveau palier, et donc gagné un titre.
    if($is_vainqueur) { //(seulement s'il est vainqueur. Sinon, ça n'arrive normalement pas.
        $new_palier = mysqli_query_with_error($mysqli, "SELECT num_palier FROM paliers_territoires WHERE territoires_min <= ({$data_player['nb_territoires']} + ($gain_territoires)) ORDER BY territoires_min DESC LIMIT 1")->fetch_assoc();
        $new_palier = $new_palier['num_palier'];
        if($new_palier > $last_palier_reached){ //Le joueur a atteint un palier encore jamais atteint ! 
            $last_palier_reached++; //Dans ce cas on augmente son palier de 1. S'il devait atteindre encore plus, ce sera à la prochaine bataille, afin de bien débloquer les titres un par un.
            $new_titre_id = 1;//On cherche maintenant le nouveau titre associé à son palier.
            switch($last_palier_reached){ //($new_titre_id prend l'id du titre correspondant dans la db) 
                case 1 : $new_titre_id = 13; break;
                case 2 : $new_titre_id = 14; break;
                case 3 : $new_titre_id = 15; break;
                case 4 : $new_titre_id = 16; break;
                case 5 : $new_titre_id = 17; break;
                case 6 : $new_titre_id = 18; break;
                case 7 : $new_titre_id = 19; break;
                case 8 : $new_titre_id = 20; break;
            }
            $deja_titre = mysqli_query_with_error($mysqli, "SELECT COUNT(*) as count FROM titres_debloques WHERE user_id='$id_player' AND titre_id = $new_titre_id;")->fetch_assoc();
            if($deja_titre['count'] == 0) //Le titre n'est pas déjà possédé par le joueur (ne devrait pas arrive,r mais soyons prudents)
                mysqli_query_with_error($mysqli, "INSERT INTO titres_debloques (user_id, titre_id) VALUES ($id_player, $new_titre_id)"); //On débloque le titre du palier.
            $gains_titre = get_data_in_db($mysqli, "titres", "titre_id", $new_titre_id, "titre_name");
        }
    }
    
    //MAJ des victime et cauchemar depuis les nouveaux résultats.
    $result = mysqli_query_with_error($mysqli, "SELECT domine_1_sur_2, idj2 FROM game_conquete_domination WHERE idj1 = '$id_player' ORDER BY domine_1_sur_2 DESC LIMIT 1")->fetch_assoc();
    $id_victime = (($result['domine_1_sur_2'] >= 3) ? $result['idj2'] : 0);
    $result = mysqli_query_with_error($mysqli, "SELECT domine_1_sur_2, idj2 FROM game_conquete_domination WHERE idj1 = '$id_player' ORDER BY domine_1_sur_2 LIMIT 1")->fetch_assoc();
    $id_cauchemar = (($result['domine_1_sur_2'] <= -3) ? $result['idj2'] : 0);
    
    $date = strtotime("now");
    mysqli_query_with_error($mysqli, "UPDATE gens SET $increment_game nb_territoires = (nb_territoires + ($gain_territoires)), last_palier_reached = $last_palier_reached, experience = (experience + $gain_xp), game_level = (game_level + $gain_niveau), victime = $id_victime, cauchemar = $id_cauchemar WHERE user_id='$id_player'");
    mysqli_query_with_error($mysqli, "INSERT INTO game_rewards(date, id_joueur, id_game, exp, territoires, posthunes, pts_chahut, level, titre) VALUES ($date, '$id_player', '$idendgame', $gain_xp, $gain_territoires, 0, 0, $gain_niveau, '$gains_titre');");
}

function recup_palier_player($mysqli, $id_player) {
    $data_player = get_line_in_db($mysqli, "gens", "user_id", $id_player, "nb_territoires, last_palier_reached, game_level, experience, out_training");
    $result = mysqli_query_with_error($mysqli, "SELECT * FROM paliers_territoires WHERE territoires_min <= {$data_player['nb_territoires']} ORDER BY territoires_min DESC LIMIT 1");
    return array($result->fetch_assoc(), $data_player);
}

if($_POST['req'] == "conquete"){ //Le serveur nous signale une fin de partie en mode conquête. TODO : axé sur deux joueurs seulement. TODO : voir ce que ça donne avec des bloc test.
	$idvainqueur = get_num($_POST['idv']);
	$idperdant = get_num($_POST['idp']);
	$idendgame = get_alphanum($_POST['ide']);
	$is_conquete = get_num($_POST['conquete']);
	if($idvainqueur == 0 || $idperdant == 0 || $idendgame == "" || $_POST['mp'] !== hash("sha256", "tsoKa".$idvainqueur."uu".$idperdant."s8d".$idendgame)){
		echo "Bad data";
		exit();
	}
        
	$date_depart = get_num($_POST['depart']) + 1388530800; //Le timestamp traitée par le serveur commence au 1/01/2014 pour éco de la place. Avec ça, on rajuste. TODO : enlever si le serveur de Louis ne fonctionne pas comme ça.
	$duree = get_num($_POST['temps']);
	$id_map = get_num($_POST['id_map']);
	$nb_ressource = get_num($_POST['nb_ressource']);
	$type_defaite = get_num($_POST['type_defaite']);
        $game_already_saved = get_data_in_db($mysqli, "games_ended", "game_id", $idendgame, "game_id");
        if($game_already_saved != NULL){
            echo "SORTIE : Game already saved"; //TODO le signaler en sortie du serveur.
            exit();
        }
        //On enregistre la trace de la bataille
        mysqli_query_with_error($mysqli, "INSERT INTO games_ended(game_id, depart, duree, id_map, nb_ressource, id_gagnant, id_perdant, type_defaite, conquete) VALUES ('$idendgame', $date_depart, $duree, $id_map, $nb_ressource, $idvainqueur, $idperdant, $type_defaite, $is_conquete);");

        if($is_conquete == 1 && $type_defaite < 10 && $type_defaite != 5) {//Au dessus de 10, c'est les codes d'égalité, donc pas de victoire et de defaite, et pas de butin. 5 c'est si une personne à pas chargé la bataille : TODO, à voir si on ne le punit pas mieux dans le futur.
            //On entre ds la DB la domination des joueurs sur l'autre. Il s'agit du nombre de bataille gagnée par idj1 moins le nombre de bataille gagnées par idj2.
            //La table comprend une ligne avec vainqueur en ij1 et perdant en idj2, et une autre ou c'est l'inverse. Le champ domine_1_sur_2 de la première ligne est l'opposé de celui de la seconde.
            $result = mysqli_query_with_error($mysqli, "SELECT  COUNT(*) as count FROM game_conquete_domination WHERE idj1 = $idvainqueur AND idj2 = $idperdant")->fetch_assoc();
            if($result['count'] > 0){ //Il y a déjà des lignes pour les résultats entre ces deux joueurs. On les actualise.
                 mysqli_multi_query_with_error($mysqli, "UPDATE game_conquete_domination SET domine_1_sur_2 = (domine_1_sur_2 + 1) WHERE idj1='$idvainqueur' AND idj2='$idperdant'; "
                                                            . "UPDATE game_conquete_domination SET domine_1_sur_2 = (domine_1_sur_2 - 1) WHERE idj2='$idvainqueur' AND idj1='$idperdant';");
            } else { //Il n'y a pas de ligne, premier affrontement entre les deux joueurs, on les entre.
                mysqli_query_with_error($mysqli, "INSERT INTO game_conquete_domination(idj1, idj2, domine_1_sur_2) VALUES ($idvainqueur, $idperdant, 1), ($idperdant, $idvainqueur, -1);");
            }
            
            $palier_n_data_vainqueur = recup_palier_player($mysqli, $idvainqueur);
            $palier_n_data_perdant = recup_palier_player($mysqli, $idperdant);

            $ajustement = 0; //Au cas où le perdant a moins de territoire que ce qu'il doit perdre, l'ajustement permet ici de le solder à 0. Bien sûr, le gagnant en gagnera d'autant moins.
            if($palier_n_data_perdant[1]['nb_territoires'] + $palier_n_data_perdant[0]['indice_defaite'] < 0)
                $ajustement = -$palier_n_data_perdant[0]['indice_defaite'] - $palier_n_data_perdant[1]['nb_territoires'];
            if($palier_n_data_vainqueur[1]['out_training'] == 0) //Le gagnant est encore en entrainement : l'autre ne perd pas de territoire (puisque le gagnant n'en gagne pas)
                $ajustement = -$palier_n_data_perdant[0]['indice_defaite'];

            save_result_player($mysqli, $idperdant, $palier_n_data_perdant, false, $palier_n_data_vainqueur[0], $idendgame, $ajustement, $type_defaite);
            save_result_player($mysqli, $idvainqueur, $palier_n_data_vainqueur, true, $palier_n_data_perdant[0], $idendgame, -$ajustement, $type_defaite);
        } else if($is_conquete == 0 && $type_defaite < 10 && $type_defaite != 5){
             mysqli_query_with_error($mysqli, "UPDATE gens SET nb_victoires_plibre = (nb_victoires_plibre + 1) WHERE user_id='$idvainqueur'");
             mysqli_query_with_error($mysqli, "UPDATE gens SET nb_defaites_plibre = (nb_defaites_plibre + 1) WHERE user_id='$idperdant'");
        }
        
        
	echo "Enregistrement ok.";
	exit();
}

echo "Rien n'est demandé.";

?>

